#include <sys\locking.h> #include <io.h> требуется только для объявления функции int locking(handle,mode,nbyte); int handle; файловый handle int mode; режим блокировки файла int nbyte; число блокированных байтов
Описание.
Функция locking блокирует или разблокирует байты nbytes файла, определенного по handle . Блокировка байтов в файле не разрешает последующего чтения и записи этих байтов другими процессами. Разблокировка файла разрешает другим процессам читать или записывать в байты, заблокированные ранее. Блокирование или разблокирование начинается с текущей позиции указателя на файл и распространяется до следующих nbyte байтов или до конца файла.
Аргумент mode определяет выполняемые действия блокировки.
Он может быть одной из следующих manifest-констант.
Мanifest-константа Значение LK_LOCK Блокировка заданных байтов. Если байты не заблокировались, происходит повторная попытка блокировки через 1 секунду. Если после 10 попыток байты не заблокировались, возвращается ошибка. LK_RLCK Аналогично LK_LOCK. LK_NBLCK Блокировка заданных байтов. Если байты не заблокированы, возвращается ошибка. LK_NRLCK Аналогично LK_NBLCK. LK_UNLCK Разблокировка заданных байтов. Байты должны быть ранее заблокированы.
Для файла может быть заблокирована более чем одна область, но работа с перекрытыми областями не допускается. Кроме того, в одно и то же время не может быть разблокирована более чем одна область.
Когда файл разблокируется, область разблокируемого файла должна соответствовать ранее заблокированной области. Функция locking не может разблокировать одновременно смежные области, так как если две области являются смежными, каждая область должна быть разблокирована отдельно.
Все блокировки должны быть удалены перед закрытием файла или перед выходом из программы.
Возвращаемое значение.
Функция locking возвращает 0, если она успешно выполнилась.
Возвращаемое значение -1 свидетельствует о неудаче и errno устанавливается в одно из следующих значений:
Значение Его смысл EACCES принудительная блокировка (файл всегда блокирован или разблокирован). EBADF неверный файловый handle. EDEADLOCK принудительная блокировка. Это значение возвращается, если задан фллаг LK_LOCK или LK_RLCK, и файл не может быть
Замечание!
Функция locking может быть использована только для версий MS DOS 3.0 и последующих, в ранних версиях MS DOS она не дает никакого результата.
Пример:
#include <io.h> #include <sys\locking.h> #include <stdlib.h> extern unsigned char _osmajor; int fh; long pos; . . . /* сохранить текущую позицию указателя на файл, затем бло- кировать область от начала файла до сохраненной позиции указателя на файл */ if (_osmajor >= 3) { pos=tell(fh); lseek(fh, OL, O); if ((locking(fh, LK_NBLCK,pos)) != -1) { . . . lseek(fh, OL, O); locking((fh, LK_UNLCK, pos); } }